/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ar.com.arkios.kfconsap.conexion;

import ar.com.arkios.kfconsap.excepciones.SapComunicationException;
import com.sap.mw.jco.IRepository;
import com.sap.mw.jco.JCO;
import java.io.IOException;



/**
 *
 * @author Ale
 * @version 1.01
 * Clase que establece la conexion y desconexion con SAP.
 * 
 */
public class SAPConnection {
    private static SAPConnection MY_INSTANCE =null;
    private static String SID = "SAPJCorep";
    private JCO.Client mConnection;
    private IRepository myRepository;
    private String myStatus = "";
    
    //Constructores
    private SAPConnection() throws SapComunicationException{ 
        try {
            this.mConnection = JCO.createClient(this.loadConfigFile());
        } catch (IOException iOException) {
            iOException.printStackTrace();
            throw new SapComunicationException("No se pudo leer el archivo de comunicación.");
        }
    }
    
    /**     
     * Singleton Pattern
     * 
     */
    public static SAPConnection getInstance() throws SapComunicationException{
        if(MY_INSTANCE==null){
            MY_INSTANCE = new SAPConnection();
        }
        return MY_INSTANCE;
    }

    public JCO.Client getConnection() {
        return this.mConnection;
    }
    
    public void open() throws SapComunicationException{        
        try {
            this.mConnection.connect();
            this.myRepository = new JCO.Repository(SID, mConnection);
        } catch (JCO.Exception e) {              
            throw new SapComunicationException(" No se pudo abrir la conexión con el servidor." + e.toString());
        }
    }
    
    public void close() throws SapComunicationException{        
        try {
            this.mConnection.disconnect();
        } catch (JCO.Exception e) {            
            throw new SapComunicationException(". Error al intentar cerrar conexión con SAP." + e.toString());
        } finally {
            myStatus = "";
        }
    }
    
    private OrderedProperties loadConfigFile() throws IOException{        
        return OrderedProperties.load("logon.properties");
    }

    public IRepository getMyRepository() {
        return myRepository;
    }

    public String getMyStatus() {
        return myStatus;
    }

    public void setMyStatus(String myStatus) {
        this.myStatus = myStatus;
    }
    
}
